<?php
    namespace Core\ORM\Requete;
    /**
     * Permet la construction d'une requête SQL
     *
     * @author mpetrini
     */
    abstract class Requete {
        /**
        * @var \Core\ORM\Table $from
        */
        protected $from;
        /**
        * @var \Utils\Tableau|\Core\ORM\Where[] $where
        */
        protected $where;
        /**
        * @var string $sql 
        */
        protected $sql;
        
        
        /**
        * Constructeur complet
        * 
        * @param \Core\ORM\Table $table (optional) (default=null)
        * 
        * @return void
        */
        public function __construct($table=null) {
            $this->from=$table;
            $this->where = new \Utils\Tableau();
        }
        /**
        * Permet d'ajouter une Table à cette Reqûete
        * 
        * @param \Core\ORM\Table $table
        * 
        * @return boolean 
        */
        public function ajoutTable($table) {
            $this->from=$table;
        }
        /**
        * Permet d'ajouter des Where dans une Requete SQL
        * 
        * @throws \
        * 
        * @param \Core\ORM\Table $table
        * @param string $nomChamp
        * @param mixed $valeur
        * 
        * @return boolean
        */
        public function ajoutWhere($table, $nomChamp, $valeur) {
            $where = new \Core\ORM\Where($table, $nomChamp, $valeur);
            $this->where->append($where);
        }
        /**
        * Permet la génération de la partie Where d'une Requête SQL
        * 
        * @return string
        */
        public function creationWhere() {
            $sql = '';
            if($this->where instanceof \Utils\Tableau) {
                $compteur = 0;
                foreach($this->where as $where) {
                    if($compteur !== 0) {
                        $sql .= ' AND ';
                    }
                    else {
                        $sql .= ' WHERE ';
                    }
                    /**
                    * @todo Ajouter une boucle au cas d'un objet ici $where->attribut 
                    */
                    if($where->getAttribut() instanceof \Core\ORM\Attributs\Objet) {
                        $sql .= $where->creationRequeteWhere();
                    }
                    else {
                        //On teste si la valeur est nulle
                        if($where->getValeur() === NULL) {
                            $sql .= $where->getTable()->getAlias().'.`'.$where->getAttribut()->getNom().'` IS NULL';
                        }
                        else {
                            $sql .= $where->getTable()->getAlias().'.`'.$where->getAttribut()->getNom().'`='
                                    .\Core\ORM\ORMClasse::$lien->quote($where->getValeur());
                        }
                        
                    }
                    $compteur++;
                }
            }
            else if(is_string($this->where)) {
                $sql = " WHERE " .$this->where;
            }
            return $sql;
        }
        /**
        * Servira à générer la Requête SQL 
        * 
        * @return string
        */
        abstract public function creation();
        /**
        * Crée le lien à la BDD s'il n'est pas déja fait
        * 
        * @return boolean
        */
        public function execution() {
            if(!\Core\ORM\ORMClasse::$lien instanceof \Core\BDD) {
                \Core\ORM\ORMClasse::initialisationLiaisonBDD();
            }
            return true;
        }
        
        //GETTERS ET SETTERS
        public function getWhere() {return $this->where;}
        public function setWhere($where) {$this->where=$where;}
        public function getSql() {return $this->sql;}
        public function setSql($sql) {$this->sql=$sql;}
    }
?>
